﻿Imports WiremetModel.Entities.OEM
Imports InputValidation
Imports InputValidation.GeneralRules
Imports InputValidation.GeneralRules.NumericInputRules
Imports System.ComponentModel
Imports WiremetModel.Specification.OemSpecifications


Public Class GatunekInputDialog


    Private _unitOfWork As UnitOfWork
    Private _inputValidator As InputValidator

    Private _gatunek As Gatunek
    Public Property Gatunek() As Gatunek
        Get
            Return _gatunek
        End Get
        Set(ByVal value As Gatunek)
            _gatunek = value
        End Set
    End Property


    Public Sub New(ByRef unitOfWork As UnitOfWork)
        InitializeComponent()
        '_unitOfWork = New UnitOfWork()
        _unitOfWork = unitOfWork
        _gatunek = New Gatunek()
        RefreshViewData()
        _inputValidator = New InputValidator()
        ClearErrorLabels()
        tlp_Details.Enabled = False
    End Sub


    Public Sub New(ByRef unitOfWork As UnitOfWork, ByVal gatunek As Gatunek)
        Me.New(unitOfWork)
        tb_EnglishName.Text = gatunek.NazwaAng
        tb_GermanName.Text = gatunek.NazwaNiem
        tb_PolishName.Text = gatunek.Nazwa
        cmb_Stop.SelectedItem = gatunek.Stop
        tb_Vat.Text = (gatunek.VAT * 100).ToString("G29")


        For index As Integer = 0 To clbx_NormyGatunku.Items.Count - 1 Step 1
            Dim norma As Norma = CType(clbx_NormyGatunku.Items(index), Norma)
            If gatunek.NormaAsocList.Any(Function(x) x.Norma.Id = norma.Id) Then
                clbx_NormyGatunku.SetItemChecked(index, True)
            End If
        Next

        _gatunek = gatunek
    End Sub


    Private Sub GatunekInputDialog_FormClosed(ByVal sender As Object, ByVal e As FormClosedEventArgs) Handles Me.FormClosed
        '_unitOfWork.Dispose()
    End Sub


    Private Sub RefreshViewData()

        Dim normaRepository As New Repository(Of Norma)(_unitOfWork)
        Dim normaList As IEnumerable(Of Norma) = normaRepository.GetAll()
        clbx_NormyGatunku.Items.AddRange(normaList.ToArray())

        Dim stopRepository As New Repository(Of [Stop])(_unitOfWork)
        Dim stopList As IEnumerable(Of [Stop]) = stopRepository.GetAll()
        InitializeInputComboBox(cmb_Stop, stopList)


        Dim normaGatunekAsocRepository As New Repository(Of NormaGatunekAsoc)(_unitOfWork)
        Dim normaGatunekAsocList As IEnumerable(Of NormaGatunekAsoc) = normaGatunekAsocRepository.GetAll()
        
        Dim tolerancjaSrednicyAsocList As IList(Of NormaGatunekAsoc) = normaGatunekAsocList.Where(Function(x) x.TolerancjeSrednicy.Any()).ToList()
        tolerancjaSrednicyAsocList.Add(New NormaGatunekAsoc())

        Dim zakresyWytrzymalosciAsocList As IList(Of NormaGatunekAsoc) = normaGatunekAsocList.Where(Function(x) x.ZakresyWytrzymalosci.Any()).ToList()
        zakresyWytrzymalosciAsocList.Add(New NormaGatunekAsoc())


        InitializeInputComboBox(ts_cmb_GatunekTolerancjeSrednicy, tolerancjaSrednicyAsocList)
        InitializeInputComboBox(ts_cmb_GatunekZakresWytrzymalosci, zakresyWytrzymalosciAsocList)
    End Sub


    Private Sub InitializeInputComboBox(ByRef inputComboBox As ComboBox, ByVal data As IEnumerable(Of Object))

        inputComboBox.DataSource = New BindingSource(data, Nothing)
        inputComboBox.AutoCompleteCustomSource.Clear()
        inputComboBox.AutoCompleteCustomSource.AddRange(data.Select(Function(x) x.ToString()).ToArray())
        inputComboBox.SelectedIndex = -1

    End Sub

    Private Sub InitializeInputComboBox(ByRef inputComboBox As ToolStripComboBox, ByVal data As IEnumerable(Of Object))

        inputComboBox.Items.AddRange(data.ToArray())
        inputComboBox.AutoCompleteCustomSource.Clear()
        inputComboBox.AutoCompleteCustomSource.AddRange(data.Select(Function(x) x.ToString()).ToArray())
        inputComboBox.SelectedIndex = -1

    End Sub

    Private Sub RefreshTolerancjeSrednicyTable(ByVal data As IEnumerable(Of NormaGatunekTolerancjaSrednicy))
        dgv_TolerancjeSrednicy.Rows.Clear()
        For Each tolerancjaSrednicy As NormaGatunekTolerancjaSrednicy In data
            Dim rowIndex As Integer = AddRowTolerancjaSrednicy(tolerancjaSrednicy)
            dgv_TolerancjeSrednicy.Rows(rowIndex).Tag = tolerancjaSrednicy
        Next
    End Sub

    Private Sub RefreshZakresyWytrzymalosciTable(ByVal data As IEnumerable(Of NormaGatunekZakresWytrzymalosci))
        dgv_ZakresyWytrzymalosci.Rows.Clear()
        For Each zakresWytrzymalosci As NormaGatunekZakresWytrzymalosci In data
            Dim rowIndex As Integer = AddRowZakresWytrzymalosci(zakresWytrzymalosci)
            dgv_ZakresyWytrzymalosci.Rows(rowIndex).Tag = zakresWytrzymalosci
        Next
    End Sub

    Private Function AddRowTolerancjaSrednicy(ByVal tolerancjaSrednicy As NormaGatunekTolerancjaSrednicy) As Integer
        Return dgv_TolerancjeSrednicy.Rows.Add(
            "[ " & tolerancjaSrednicy.SrednicaMinimalna & " ; " & tolerancjaSrednicy.SrednicaMaksymalna & " )",
            tolerancjaSrednicy.TolerancjaDolna,
            tolerancjaSrednicy.TolerancjaGorna
        )
    End Function

    Private Function AddRowZakresWytrzymalosci(ByVal zakresWytrzymalosci As NormaGatunekZakresWytrzymalosci) As Integer
        Return dgv_ZakresyWytrzymalosci.Rows.Add(
            "[ " & zakresWytrzymalosci.SrednicaMinimalna & " ; " & zakresWytrzymalosci.SrednicaMaksymalna & " )",
            zakresWytrzymalosci.WytrzymaloscMinimalna,
            zakresWytrzymalosci.WytrzymaloscMaksymalna
        )
    End Function

    Private Function GetSelectedTolerancjaSrednicy() As NormaGatunekTolerancjaSrednicy
        If dgv_TolerancjeSrednicy.SelectedRows.Count = 0 Then
            Return Nothing
        Else
            Return CType(dgv_TolerancjeSrednicy.SelectedRows(0).Tag, NormaGatunekTolerancjaSrednicy)
        End If
    End Function

    Private Function GetSelectedZakresWytrzymalosci() As NormaGatunekZakresWytrzymalosci
        If dgv_ZakresyWytrzymalosci.SelectedRows.Count = 0 Then
            Return Nothing
        Else
            Return CType(dgv_ZakresyWytrzymalosci.SelectedRows(0).Tag, NormaGatunekZakresWytrzymalosci)
        End If
    End Function


    Private Function GetSelectedNorma() As Norma
        Return CType(clbx_NormyGatunku.SelectedItem, Norma)
    End Function

    Private Function GetNormaAsoc(ByVal norma As Norma) As NormaGatunekAsoc
        Return Gatunek.NormaAsocList.FirstOrDefault(Function(x) x.Norma.Id = norma.Id)
    End Function


    Private Sub clbx_NormyGatunku_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles clbx_NormyGatunku.SelectedIndexChanged
        Dim selectedIndex As Integer = clbx_NormyGatunku.SelectedIndex
        Dim selectedNorma As Norma = GetSelectedNorma()
        Dim normaAsoc As NormaGatunekAsoc = GetNormaAsoc(selectedNorma)

        If Not IsNothing(selectedNorma) AndAlso clbx_NormyGatunku.GetItemChecked(selectedIndex) AndAlso Not IsNothing(normaAsoc) Then
            tlp_Details.Enabled = True
            RefreshTolerancjeSrednicyTable(normaAsoc.TolerancjeSrednicy)
            RefreshZakresyWytrzymalosciTable(normaAsoc.ZakresyWytrzymalosci)
            ts_btn_CopySrednicaTolerancje.Enabled = False
            ts_btn_CopyZakresyWytrzymalosci.Enabled = False

            If Not normaAsoc.TolerancjeSrednicy.Any() Then
                ts_btn_EditTolerancjaSrednicy.Enabled = False
                ts_btn_RemoveTolerancjaSrednicy.Enabled = False
            End If

            If Not normaAsoc.ZakresyWytrzymalosci.Any() Then
                ts_btn_EditZakresWytrzymalosci.Enabled = False
                ts_btn_RemoveZakresWytrzymalosci.Enabled = False
            End If

        Else
            tlp_Details.Enabled = False
            dgv_TolerancjeSrednicy.Rows.Clear()
            dgv_ZakresyWytrzymalosci.Rows.Clear()
        End If

        ts_cmb_GatunekTolerancjeSrednicy.SelectedIndex = -1
        ts_cmb_GatunekZakresWytrzymalosci.SelectedIndex = -1

    End Sub

    Private Sub clbx_NormyGatunku_ItemCheck(sender As Object, e As ItemCheckEventArgs) Handles clbx_NormyGatunku.ItemCheck
        Dim checkedNorma As Norma = CType(clbx_NormyGatunku.Items(e.Index), Norma)
        Dim normaAsoc As NormaGatunekAsoc = GetNormaAsoc(checkedNorma)

        If e.CurrentValue = CheckState.Checked Then

            If Not normaAsoc.TolerancjeSrednicy.Any() AndAlso Not normaAsoc.ZakresyWytrzymalosci.Any() OrElse
                MessageBox.Show("Odznaczenie normy spowoduje usunięcie tolerancji średnic oraz zakresów wytrzymałości.", "Uwaga!", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) = Windows.Forms.DialogResult.Yes Then
                Gatunek.NormaAsocList.Remove(Gatunek.NormaAsocList.First(Function(x) x.Norma.Id = checkedNorma.Id))
                e.NewValue = CheckState.Unchecked
            Else
                e.NewValue = CheckState.Checked
            End If
        Else
            Gatunek.AddNormaAsoc(checkedNorma)
            e.NewValue = CheckState.Checked
        End If
    End Sub


    Private Function GetTolerancjeSrednicyToCopy() As IList(Of NormaGatunekTolerancjaSrednicy)
        Dim selectedNormaAsoc As NormaGatunekAsoc = CType(ts_cmb_GatunekTolerancjeSrednicy.SelectedItem, NormaGatunekAsoc)
        If IsNothing(selectedNormaAsoc) Then
            Return New List(Of NormaGatunekTolerancjaSrednicy)
        ElseIf selectedNormaAsoc.Id = 0 Then
            Dim normaAsoc As NormaGatunekAsoc = GetNormaAsoc(GetSelectedNorma())
            Return normaAsoc.TolerancjeSrednicy
        Else
            Return selectedNormaAsoc.TolerancjeSrednicy
        End If
    End Function

    Private Function GetZakresyWytrzymalosciToCopy() As IList(Of NormaGatunekZakresWytrzymalosci)
        Dim selectedNormaAsoc As NormaGatunekAsoc = CType(ts_cmb_GatunekZakresWytrzymalosci.SelectedItem, NormaGatunekAsoc)
        If IsNothing(selectedNormaAsoc) Then
            Return New List(Of NormaGatunekZakresWytrzymalosci)
        ElseIf selectedNormaAsoc.Id = 0 Then
            Dim normaAsoc As NormaGatunekAsoc = GetNormaAsoc(GetSelectedNorma())
            Return normaAsoc.ZakresyWytrzymalosci
        Else
            Return selectedNormaAsoc.ZakresyWytrzymalosci
        End If
    End Function


    Private Sub ts_cmb_GatunekTolerancjeSrednicy_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ts_cmb_GatunekTolerancjeSrednicy.SelectedIndexChanged
        Dim tolerancjeSrednicyToCopy As IList(Of NormaGatunekTolerancjaSrednicy) = GetTolerancjeSrednicyToCopy()
        RefreshTolerancjeSrednicyTable(tolerancjeSrednicyToCopy)
        
        If tolerancjeSrednicyToCopy.Count > 0 Then
            ts_btn_AddTolerancjaSrednicy.Enabled = False
            dgv_TolerancjeSrednicy.CurrentRow.Selected = False
            ts_btn_CopySrednicaTolerancje.Enabled = True
        Else
            ts_btn_AddTolerancjaSrednicy.Enabled = True 
            ts_btn_CopySrednicaTolerancje.Enabled = False
        End If

        ts_btn_EditTolerancjaSrednicy.Enabled = False
        ts_btn_RemoveTolerancjaSrednicy.Enabled = False

        Dim selectedNormaAsoc As NormaGatunekAsoc = CType(ts_cmb_GatunekTolerancjeSrednicy.SelectedItem, NormaGatunekAsoc)
        If Not IsNothing(selectedNormaAsoc) AndAlso selectedNormaAsoc.Id = 0 Then
            ts_btn_AddTolerancjaSrednicy.Enabled = True
            ts_btn_CopySrednicaTolerancje.Enabled = False
            If tolerancjeSrednicyToCopy.Count > 0 Then
                ts_btn_EditTolerancjaSrednicy.Enabled = True
                ts_btn_RemoveTolerancjaSrednicy.Enabled = True
            End If
        End If

        dgv_TolerancjeSrednicy.Focus()
    End Sub

    Private Sub ts_cmb_GatunekZakresWytrzymalosci_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ts_cmb_GatunekZakresWytrzymalosci.SelectedIndexChanged
        Dim zakresyWytrzymalosciToCopy As IList(Of NormaGatunekZakresWytrzymalosci) = GetZakresyWytrzymalosciToCopy()
        RefreshZakresyWytrzymalosciTable(zakresyWytrzymalosciToCopy)
        
        If zakresyWytrzymalosciToCopy.Count > 0 Then
            ts_btn_AddZakresWytrzymalosci.Enabled = False
            dgv_ZakresyWytrzymalosci.CurrentRow.Selected = False
            ts_btn_CopyZakresyWytrzymalosci.Enabled = True
        Else
            ts_btn_AddZakresWytrzymalosci.Enabled = True
            ts_btn_CopyZakresyWytrzymalosci.Enabled = False
        End If

        ts_btn_EditZakresWytrzymalosci.Enabled = False
        ts_btn_RemoveZakresWytrzymalosci.Enabled = False

        Dim selectedNormaAsoc As NormaGatunekAsoc = CType(ts_cmb_GatunekZakresWytrzymalosci.SelectedItem, NormaGatunekAsoc)
        If Not IsNothing(selectedNormaAsoc) AndAlso selectedNormaAsoc.Id = 0 Then
            ts_btn_AddZakresWytrzymalosci.Enabled = True
            ts_btn_CopyZakresyWytrzymalosci.Enabled = False
            If zakresyWytrzymalosciToCopy.Count > 0 Then
                ts_btn_EditTolerancjaSrednicy.Enabled = True
                ts_btn_RemoveTolerancjaSrednicy.Enabled = True
            End If
        End If

        dgv_ZakresyWytrzymalosci.Focus()
    End Sub

    Private Sub ts_btn_CopySrednicaTolerancje_Click(sender As System.Object, e As System.EventArgs) Handles ts_btn_CopySrednicaTolerancje.Click
        Try
            Dim normaAsoc As NormaGatunekAsoc = GetNormaAsoc(GetSelectedNorma())
            Dim tolerancjeSrednicyToCopy As IList(Of NormaGatunekTolerancjaSrednicy) = GetTolerancjeSrednicyToCopy()


            If normaAsoc.TolerancjeSrednicy.Count = 0 OrElse
                MessageBox.Show("Czy jesteś pewien?" & vbNewLine &
                                "Skopiowanie tolerancji spowoduje utratę dotychczasowych.", "Uwaga!",
                                MessageBoxButtons.YesNo, MessageBoxIcon.Warning) = Windows.Forms.DialogResult.Yes Then

                Cursor = Cursors.WaitCursor

                normaAsoc.TolerancjeSrednicy.Clear()
                normaAsoc.AddTolerancjaSrednicy(tolerancjeSrednicyToCopy)
                ts_cmb_GatunekTolerancjeSrednicy.Text = String.Empty

                ts_btn_AddTolerancjaSrednicy.Enabled = True
                ts_btn_EditTolerancjaSrednicy.Enabled = True
                ts_btn_RemoveTolerancjaSrednicy.Enabled = True

            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Finally
            Cursor = Cursors.Default
        End Try
    End Sub

    Private Sub ts_btn_CopyZakresyWytrzymalosci_Click(sender As System.Object, e As System.EventArgs) Handles ts_btn_CopyZakresyWytrzymalosci.Click
        Try
            Dim normaAsoc As NormaGatunekAsoc = GetNormaAsoc(GetSelectedNorma())
            Dim zakresyWytrzymalosciToCopy As IList(Of NormaGatunekZakresWytrzymalosci) = GetZakresyWytrzymalosciToCopy()


            If normaAsoc.ZakresyWytrzymalosci.Count = 0 OrElse
                MessageBox.Show("Czy jesteś pewien?" & vbNewLine &
                                "Skopiowanie tolerancji spowoduje utratę dotychczasowych.", "Uwaga!",
                                MessageBoxButtons.YesNo, MessageBoxIcon.Warning) = Windows.Forms.DialogResult.Yes Then

                Cursor = Cursors.WaitCursor

                normaAsoc.ZakresyWytrzymalosci.Clear()
                normaAsoc.AddZakresWytrzymalosci(zakresyWytrzymalosciToCopy)
                ts_cmb_GatunekZakresWytrzymalosci.Text = String.Empty

                ts_btn_AddZakresWytrzymalosci.Enabled = True
                ts_btn_EditZakresWytrzymalosci.Enabled = True
                ts_btn_RemoveZakresWytrzymalosci.Enabled = True

            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Finally
            Cursor = Cursors.Default
        End Try
    End Sub


    Public Sub EnsureNormaIsSelected()
        If clbx_NormyGatunku.SelectedItems.Count = 0 Then
            Throw New Exception("Proszę, wybierz normę, aby kontynuować.")
        End If
    End Sub

    Public Sub EnsureTolerancjaSrednicyIsSelected()
        If dgv_TolerancjeSrednicy.SelectedRows.Count = 0 Then
            Throw New Exception("Proszę, wybierz tolerancję średnicy, aby kontynuować.")
        End If
    End Sub

    Public Sub EnsureZakresWytrzymalosciIsSelected()
        If dgv_ZakresyWytrzymalosci.SelectedRows.Count = 0 Then
            Throw New Exception("Proszę wybierz zakres wytrzymałości, aby kontynuować.")
        End If
    End Sub


#Region "Średnica - tolerancje"

    Private Sub ts_btn_AddTolerancjaSrednicy_Click(sender As System.Object, e As System.EventArgs) Handles ts_btn_AddTolerancjaSrednicy.Click
        Try
            EnsureNormaIsSelected()
            Dim normaAsoc As NormaGatunekAsoc = GetNormaAsoc(GetSelectedNorma())
            Dim normaGatunekTolerancjaSrednicyInputDialog As New NormaGatunekTolerancjaSrednicyInputDialog(normaAsoc.TolerancjeSrednicy)
            Dim dialogResult As DialogResult = normaGatunekTolerancjaSrednicyInputDialog.ShowDialog()

            If dialogResult = Windows.Forms.DialogResult.OK Then

                Dim normaTolerancjaSrednicy As NormaGatunekTolerancjaSrednicy = normaGatunekTolerancjaSrednicyInputDialog.NormaGatunekTolerancjaSrednicy
                normaAsoc.AddTolerancjaSrednicy(normaTolerancjaSrednicy)

                Dim newRowIndex As Integer = AddRowTolerancjaSrednicy(normaTolerancjaSrednicy)
                dgv_TolerancjeSrednicy.Rows(newRowIndex).Tag = normaTolerancjaSrednicy
                dgv_TolerancjeSrednicy.Rows(newRowIndex).Selected = True
                dgv_TolerancjeSrednicy.Sort(dgv_TolerancjeSrednicy.Columns("Zakres"), ListSortDirection.Ascending)

                ts_btn_AddTolerancjaSrednicy.Enabled = True
                ts_btn_EditZakresWytrzymalosci.Enabled = True

            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

    Private Sub ts_btn_EditTolerancjaSrednicy_Click(sender As System.Object, e As System.EventArgs) Handles ts_btn_EditTolerancjaSrednicy.Click
        Try
            EnsureNormaIsSelected()
            EnsureTolerancjaSrednicyIsSelected()

            Dim selectedTolerancjaSrednicy As NormaGatunekTolerancjaSrednicy = GetSelectedTolerancjaSrednicy()
            Dim selectedRowIndex As Integer = dgv_TolerancjeSrednicy.SelectedRows(0).Index
            Dim normaAsoc As NormaGatunekAsoc = GetNormaAsoc(GetSelectedNorma())

            Dim normaGatunekTolerancjaSrednicyInputDialog As New NormaGatunekTolerancjaSrednicyInputDialog(normaAsoc.TolerancjeSrednicy.Except(New NormaGatunekTolerancjaSrednicy() {selectedTolerancjaSrednicy}), selectedTolerancjaSrednicy)
            Dim dialogResult As DialogResult = normaGatunekTolerancjaSrednicyInputDialog.ShowDialog()
            If dialogResult = Windows.Forms.DialogResult.OK Then

                Dim editedNormaTolerancjaSrednicy As NormaGatunekTolerancjaSrednicy = normaGatunekTolerancjaSrednicyInputDialog.NormaGatunekTolerancjaSrednicy

                Dim index As Integer = normaAsoc.TolerancjeSrednicy.IndexOf(selectedTolerancjaSrednicy)
                normaAsoc.TolerancjeSrednicy(index) = editedNormaTolerancjaSrednicy

                dgv_TolerancjeSrednicy.Rows.RemoveAt(selectedRowIndex)
                Dim newRowIndex As Integer = AddRowTolerancjaSrednicy(editedNormaTolerancjaSrednicy)
                dgv_TolerancjeSrednicy.Rows(newRowIndex).Tag = editedNormaTolerancjaSrednicy
                dgv_TolerancjeSrednicy.Rows(newRowIndex).Selected = True
                dgv_TolerancjeSrednicy.Sort(dgv_TolerancjeSrednicy.Columns("Zakres"), ListSortDirection.Ascending)

            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

    Private Sub ts_btn_RemoveTolerancjaSrednicy_Click(sender As System.Object, e As System.EventArgs) Handles ts_btn_RemoveTolerancjaSrednicy.Click
        Try
            EnsureNormaIsSelected()
            EnsureTolerancjaSrednicyIsSelected()

            Dim selectedTolerancjaSrednicy As NormaGatunekTolerancjaSrednicy = GetSelectedTolerancjaSrednicy()
            Dim selectedRowIndex As Integer = dgv_TolerancjeSrednicy.SelectedRows(0).Index

            Dim dialogResult As DialogResult = MessageBox.Show("Czy jesteś pewien?", "Uwaga!", MessageBoxButtons.YesNo, MessageBoxIcon.Warning)
            If dialogResult = Windows.Forms.DialogResult.Yes Then

                Dim normaAsoc As NormaGatunekAsoc = GetNormaAsoc(GetSelectedNorma())
                normaAsoc.TolerancjeSrednicy.Remove(selectedTolerancjaSrednicy)
                dgv_TolerancjeSrednicy.Rows.RemoveAt(selectedRowIndex)

                If normaAsoc.TolerancjeSrednicy.Count = 0 Then
                    ts_btn_EditTolerancjaSrednicy.Enabled = False
                    ts_btn_RemoveTolerancjaSrednicy.Enabled = False
                End If

            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

#End Region


#Region "Wytrzymałość - zakresy"

    Private Sub ts_btn_AddZakresWytrzymalosci_Click(sender As System.Object, e As System.EventArgs) Handles ts_btn_AddZakresWytrzymalosci.Click
        Try
            EnsureNormaIsSelected()
            Dim normaAsoc As NormaGatunekAsoc = GetNormaAsoc(GetSelectedNorma())
            Dim normaGatunekZakresWytrzymalosciInputDialog As New NormaGatunekZakresWytrzymalosciInputDialog(normaAsoc.ZakresyWytrzymalosci)
            Dim dialogResult As DialogResult = normaGatunekZakresWytrzymalosciInputDialog.ShowDialog()

            If dialogResult = Windows.Forms.DialogResult.OK Then

                Dim normaZakresWytrzymalosci As NormaGatunekZakresWytrzymalosci = normaGatunekZakresWytrzymalosciInputDialog.NormaGatunekZakresWytrzymalosci
                normaAsoc.AddZakresWytrzymalosci(normaZakresWytrzymalosci)

                Dim newRowIndex As Integer = AddRowZakresWytrzymalosci(normaZakresWytrzymalosci)
                dgv_ZakresyWytrzymalosci.Rows(newRowIndex).Tag = normaZakresWytrzymalosci
                dgv_ZakresyWytrzymalosci.Rows(newRowIndex).Selected = True
                dgv_ZakresyWytrzymalosci.Sort(dgv_ZakresyWytrzymalosci.Columns("Przedział"), ListSortDirection.Ascending)

                ts_btn_AddZakresWytrzymalosci.Enabled = True
                ts_btn_EditZakresWytrzymalosci.Enabled = True

            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

    Private Sub ts_btn_EditZakresWytrzymalosci_Click(sender As System.Object, e As System.EventArgs) Handles ts_btn_EditZakresWytrzymalosci.Click
        Try
            EnsureNormaIsSelected()
            EnsureZakresWytrzymalosciIsSelected()

            Dim selectedZakresWytrzymalosci As NormaGatunekZakresWytrzymalosci = GetSelectedZakresWytrzymalosci()
            Dim selectedRowIndex As Integer = dgv_ZakresyWytrzymalosci.SelectedRows(0).Index
            Dim normaAsoc As NormaGatunekAsoc = GetNormaAsoc(GetSelectedNorma())

            Dim normaGatunekZakresWytrzymalosciInputDialog As New NormaGatunekZakresWytrzymalosciInputDialog(normaAsoc.ZakresyWytrzymalosci.Except(New NormaGatunekZakresWytrzymalosci() {selectedZakresWytrzymalosci}),
                                                                                                             selectedZakresWytrzymalosci)
            Dim dialogResult As DialogResult = normaGatunekZakresWytrzymalosciInputDialog.ShowDialog()
            If dialogResult = Windows.Forms.DialogResult.OK Then

                Dim editedNormaZakresWytrzymalosci As NormaGatunekZakresWytrzymalosci = normaGatunekZakresWytrzymalosciInputDialog.NormaGatunekZakresWytrzymalosci

                Dim index As Integer = normaAsoc.ZakresyWytrzymalosci.IndexOf(selectedZakresWytrzymalosci)
                normaAsoc.ZakresyWytrzymalosci(index) = editedNormaZakresWytrzymalosci

                dgv_TolerancjeSrednicy.Rows.RemoveAt(selectedRowIndex)
                Dim newRowIndex As Integer = AddRowZakresWytrzymalosci(editedNormaZakresWytrzymalosci)
                dgv_ZakresyWytrzymalosci.Rows(newRowIndex).Tag = editedNormaZakresWytrzymalosci
                dgv_ZakresyWytrzymalosci.Rows(newRowIndex).Selected = True
                dgv_ZakresyWytrzymalosci.Sort(dgv_ZakresyWytrzymalosci.Columns("Przedział"), ListSortDirection.Ascending)

            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

    Private Sub ts_btn_RemoveZakresWytrzymalosci_Click(sender As System.Object, e As System.EventArgs) Handles ts_btn_RemoveZakresWytrzymalosci.Click
        Try
            EnsureNormaIsSelected()
            EnsureZakresWytrzymalosciIsSelected()

            Dim selectedZakresWytrzymalosci As NormaGatunekZakresWytrzymalosci = GetSelectedZakresWytrzymalosci()
            Dim selectedRowIndex As Integer = dgv_ZakresyWytrzymalosci.SelectedRows(0).Index

            Dim dialogResult As DialogResult = MessageBox.Show("Czy jesteś pewien?", "Uwaga!", MessageBoxButtons.YesNo, MessageBoxIcon.Warning)
            If dialogResult = Windows.Forms.DialogResult.Yes Then

                Dim normaAsoc As NormaGatunekAsoc = GetNormaAsoc(GetSelectedNorma())
                normaAsoc.ZakresyWytrzymalosci.Remove(selectedZakresWytrzymalosci)
                dgv_ZakresyWytrzymalosci.Rows.RemoveAt(selectedRowIndex)

                If normaAsoc.ZakresyWytrzymalosci.Count = 0 Then
                    ts_btn_EditZakresWytrzymalosci.Enabled = False
                    ts_btn_RemoveZakresWytrzymalosci.Enabled = False
                End If

            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

#End Region

#Region "Normy - CRUD"
    Private Sub ts_btn_AddNorma_Click(sender As System.Object, e As System.EventArgs) Handles ts_btn_AddNorma.Click
        Try
            Dim normaInputDialog As New NormaInputDialog()
            If normaInputDialog.ShowDialog() = Windows.Forms.DialogResult.OK Then

                Dim newNorma As Norma = normaInputDialog.Norma
                Dim normaRepository As New Repository(Of Norma)(_unitOfWork)
                _unitOfWork.BeginTransaction()
                normaRepository.Add(newNorma)
                _unitOfWork.CommitTransaction()

                clbx_NormyGatunku.Items.Add(newNorma)

            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

    Private Sub ts_btn_EditNorma_Click(sender As System.Object, e As System.EventArgs) Handles ts_btn_EditNorma.Click
        Try
            EnsureNormaIsSelected()
            Dim selectedNorma As Norma = GetSelectedNorma()
            Dim selectedNormaIndex As Integer = clbx_NormyGatunku.SelectedIndex
            Dim normaInputDialog As New NormaInputDialog(selectedNorma)

            If normaInputDialog.ShowDialog() = Windows.Forms.DialogResult.OK Then

                Dim editedNorma As Norma = normaInputDialog.Norma
                Dim normaRepository As New Repository(Of Norma)(_unitOfWork)
                _unitOfWork.BeginTransaction()
                normaRepository.Update(editedNorma)
                _unitOfWork.CommitTransaction()

                clbx_NormyGatunku.Items(selectedNormaIndex) = editedNorma

            End If

        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

    Private Sub ts_btn_RemoveNorma_Click(sender As System.Object, e As System.EventArgs) Handles ts_btn_RemoveNorma.Click
        Try
            EnsureNormaIsSelected()
            Dim confirmationDialogResult As DialogResult = MessageBox.Show("Czy na pewno chcesz usunąć wybraną normę?", "Uwaga!", MessageBoxButtons.YesNo, MessageBoxIcon.Warning)

            If confirmationDialogResult = Windows.Forms.DialogResult.Yes Then
                Dim selectedNorma As Norma = GetSelectedNorma()
                Dim selectedNormaIndex As Integer = clbx_NormyGatunku.SelectedIndex


                Dim normaGatunekAsocRepository As New Repository(Of NormaGatunekAsoc)(_unitOfWork)
                Dim normaSpecification As New NormaSpecification(Of NormaGatunekAsoc)(selectedNorma)

                If normaGatunekAsocRepository.GetAllMatching(normaSpecification).Any() Then
                    Throw New Exception("Norma " & selectedNorma.Nazwa & " nie może zostać usunięta." & vbNewLine &
                                        "Istnieją gatunki, które odnoszą się do tej normy.")
                End If


                Dim normaRepository As New Repository(Of Norma)(_unitOfWork)
                _unitOfWork.BeginTransaction()
                normaRepository.Delete(selectedNorma)
                _unitOfWork.CommitTransaction()

                clbx_NormyGatunku.Items.RemoveAt(selectedNormaIndex)

            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub
#End Region


#Region "Input validation"

    Private Sub ClearErrorLabels()
        lbl_EnglishNameError.Text = String.Empty
        lbl_GermanNameError.Text = String.Empty
        lbl_PolishNameError.Text = String.Empty
        lbl_StopError.Text = String.Empty
        lbl_VatError.Text = String.Empty
    End Sub


    Private Sub tb_EnglishName_Validating(ByVal sender As Object, ByVal e As CancelEventArgs) Handles tb_EnglishName.Validating
        Dim notNullableTextInputValidatingSpecification As New NotNullableTextInputValidatingSpecification()
        _inputValidator.ValidateTextBox(tb_EnglishName, e, lbl_EnglishNameError, notNullableTextInputValidatingSpecification)
    End Sub

    Private Sub tb_PolishName_Validating(ByVal sender As Object, ByVal e As CancelEventArgs) Handles tb_PolishName.Validating
        'Dim notNullableTextInputValidatingSpecification As New NotNullableTextInputValidatingSpecification()
        '_inputValidator.ValidateTextBox(tb_PolishName, e, lbl_PolishNameError, notNullableTextInputValidatingSpecification)
    End Sub

    Private Sub tb_GermanName_Validating(ByVal sender As Object, ByVal e As CancelEventArgs) Handles tb_GermanName.Validating
        'Dim notNullableTextInputValidatingSpecification As New NotNullableTextInputValidatingSpecification()
        '_inputValidator.ValidateTextBox(tb_GermanName, e, lbl_GermanNameError, notNullableTextInputValidatingSpecification)
    End Sub

    Private Sub cmb_Stop_Validating(ByVal sender As Object, ByVal e As CancelEventArgs) Handles cmb_Stop.Validating
        Dim notNullableComboBoxValidatingSpecification As New NotNullableComboBoxValidatingSpecification(Of [Stop])
        _inputValidator.ValidateComboBox(cmb_Stop, e, lbl_StopError, notNullableComboBoxValidatingSpecification)
    End Sub

    Private Sub tb_Vat_Validating(ByVal sender As Object, ByVal e As CancelEventArgs) Handles tb_Vat.Validating
        Dim notNullable As New NotNullableTextInputValidatingSpecification()
        Dim numeric As New NumericInputValidatingSpecification()
        Dim notNegative As New NumericNotNegativeInputValidatingSpecification()
        _inputValidator.ValidateTextBox(tb_Vat, e, lbl_VatError, notNullable.And(numeric).And(notNegative))
    End Sub

    Private Sub tb_EnglishName_Validated(ByVal sender As Object, ByVal e As EventArgs) Handles tb_EnglishName.Validated
        lbl_EnglishNameError.Text = String.Empty
    End Sub

    Private Sub tb_PolishName_Validated(ByVal sender As Object, ByVal e As EventArgs) Handles tb_PolishName.Validated
        lbl_PolishNameError.Text = String.Empty
    End Sub

    Private Sub tb_GermanName_Validated(ByVal sender As Object, ByVal e As EventArgs) Handles tb_GermanName.Validated
        lbl_GermanNameError.Text = String.Empty
    End Sub

    Private Sub cmb_Stop_Validated(ByVal sender As Object, ByVal e As EventArgs) Handles cmb_Stop.Validated
        lbl_StopError.Text = String.Empty
    End Sub

    Private Sub tb_Vat_Validated(ByVal sender As Object, ByVal e As EventArgs) Handles tb_Vat.Validated
        lbl_VatError.Text = String.Empty
    End Sub

#End Region


    Private Sub btn_Accept_Click(sender As System.Object, e As System.EventArgs) Handles btn_Accept.Click
        Try
            If Not ValidateChildren() Then
                Throw New EntityDataInputException("Podane dane są nieprawidłowe." & vbNewLine &
                                                   "Popraw je i spróbuj ponownie.")
            End If

            If clbx_NormyGatunku.CheckedItems.Count = 0 Then
                Throw New EntityDataInputException("Proszę, wybierz co najmniej jedną normę, którą spełnia podany gatunek")
            End If


            Dim confirmationDialogResult As DialogResult = MessageBox.Show("Czy jesteś pewień?", "Uwaga!", MessageBoxButtons.YesNo, MessageBoxIcon.Warning)
            If confirmationDialogResult = Windows.Forms.DialogResult.Yes Then

                With Gatunek
                    .Nazwa = tb_PolishName.Text.Trim()
                    .NazwaAng = tb_EnglishName.Text.Trim()
                    .NazwaNiem = tb_GermanName.Text.Trim()
                    .Stop = CType(cmb_Stop.SelectedItem, [Stop])
                    .VAT = Decimal.Parse(tb_Vat.Text.Trim()) / 100D
                End With

                DialogResult = Windows.Forms.DialogResult.OK
            End If
        Catch ex As EntityDataInputException
            MessageBox.Show(ex.Message, "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

    Private Sub btn_Cancel_Click(sender As System.Object, e As System.EventArgs) Handles btn_Cancel.Click
        DialogResult = Windows.Forms.DialogResult.Cancel
    End Sub

End Class